package com.myrpc.loadBalance;

import com.myrpc.transfer.dto.RpcRequest;

import java.util.List;

public abstract class AbstractLoadBalance implements LoadBalance{
    /**
     * 对请求进行负载均衡，从给定的可请求微服务实例中，选定一个进行请求
     * 本方法主要在负载均衡前将不需要负载均衡计算的请求进行拦截，具体的负载均衡计算委托给 loadBalance 方法进行
     * @param serviceList 可请求的微服务实例列表
     * @param rpcRequest  Ppc请求
     * @return 负载均衡计算后，认定应该请求的微服务实例
     */
    @Override
    public <T> T selectService(List<T> serviceList, RpcRequest rpcRequest) {
        if (serviceList == null || serviceList.size() == 0){
            return null;
        }
        if (serviceList.size() == 1){
            return serviceList.get(0);
        }
        return loadBalance(serviceList, rpcRequest);
    }

    protected abstract <T> T loadBalance(List<T> serviceList, RpcRequest rpcRequest);
}
